from sqlalchemy.orm import Session

from common.Exception import SlideNotExistError
from pojo.slide import Slide
from utils.log import logger
from sqlalchemy import and_

def update_slide_fields(db: Session, slide_id, update_data: dict):
    """
    通用方法：根据传入字段动态更新slide记录
    :param db: SQLAlchemy Session
    :param ppt_id: 要更新的slide_id
    :param update_data: 包含要更新字段的字典
    :return: 更新后的slide对象
    """
    try:
        slide_obj = db.query(Slide).filter(Slide.slide_id == slide_id).first()
        if not slide_obj:
            raise SlideNotExistError(slide_id)
        for key, value in update_data.items():
            if hasattr(slide_obj, key):
                setattr(slide_obj, key, value)  # 动态赋值

        db.commit()
        db.refresh(slide_obj)
        return slide_obj

    except Exception as e:
        db.rollback()
        logger.info(f"错误原因：{e}")
        raise e

def get_slides_by_ppt(db: Session, ppt_id):
    """
    根据pptid查询所有的slide,slide_index 升序排序输出返回
    :param db: 数据库连接池
    :param ppt_id:
    :return:所有slides
    """
    slides_dict = []
    try:
        # 加上 order_by 实现按 slide_index 升序排序
        slides = db.query(Slide).filter(Slide.ppt_id == ppt_id).order_by(Slide.slide_index).all()
        for item_dao in slides:
            item = item_dao.to_dict()
            slides_dict.append(item)
        return slides_dict
    except Exception as e:
        db.rollback()  # 出现异常时回滚事务
        logger.info(f"查找slide失败: {e}")
        return None

def get_one_slide_ppt_index(db: Session, ppt_id: int, slide_index: int):
    """
    通过pptid和slide索引拿到具体的slide
    :param db: 数据库连接池
    :param ppt_id:
    :param slide_index: slide具体的索引号
    :return:
    """
    try:
        slide = db.query(Slide).filter(
            and_(Slide.slide_index == slide_index, Slide.ppt_id == ppt_id)
        ).first()
        return slide
    except Exception as e:
        db.rollback()  # 出现异常时回滚事务
        logger.info(f"根据索引查找slide失败: {e}")
        return None

def add_slide_service(slide: Slide):
    return None